//******************************************************************/
//				显示控制模块
//版本说明:
//V0.1		2019-08-01	11:00	yshao	灯饰控制器显示控制
//******************************************************************/
//`define	BOOT_MODE	1
module display_top(
		//复位&时钟
		input	wire			resetb,
		input	wire			sclk,
		input   wire            oclk,
		
		input	wire	[20:0]	time_us,
		input	wire	[20:0]	sync_us,

		//PHY设置总线
		input	wire			set_d_ok,
		input	wire	[31:0]	set_addr,
		input	wire	[7:0]	set_data,
		output	wire	[7:0]	rd_data,
		
		//MCU设置接口
		input	wire			cmd_d_ok,
		input	wire	[31:0]	cmd_addr,
		input	wire	[7:0]	cmd_data,
		output	wire	[7:0]	cmd_rd_d,

		//MCU辅助通讯
		input	wire			mcu_dmx_ten,
		input	wire			mcu_dmx_tx,
		output	wire			mcu_dmx_rx,
		
		//控制信号
		input   wire            init_mode,
		input   wire            local_dis_flag,
		input   wire            input_artnet,
		input   wire            input_L9,
		input   wire            vs,
		
		input	wire	[5:0]	device_port,
		output	wire			dmx_send_flag,
		
		//显示设置包信号
		input	wire	[7:0]	state,
		input	wire	[7:0]	state_2,
		input	wire	[8:0]	cascade_light,
		input	wire	[7:0]	testmode,

		//显示数据读接口
		output	wire	[1:0]	frame_buf_sel,
		output	wire			mem_read_req,
		output	wire	[9:0]	mem_pixel_addr,
		input	wire			mem_data_sync,
		input	wire	[31:0]	mem_read_data,
		input	wire			map_adj_en,

		//帧输出起始
		output	wire			vs_out,
		output	wire			out_sync,
		
		//端口输入输出
		output	wire	[7:0]	port_da,
		output	wire	[7:0]	port_le,
`ifdef H611
		output	wire	[5:0]	port_ex,
		input	wire			port_in,
`else
		inout	tri		[7:0]	port_ex,
`endif
		
		//调试接口
		output	wire	[15:0]	tout
		);

//****************************************************************
//		内部信号
//****************************************************************
//显示缓冲切换
reg	[4:0]	vs_t, vsout_t;
reg		f_buf_sel, f_buf_sel_w, f_buf_sel_r;

//黑屏
wire		v_start, black;

//数据接口
wire	[15:0]	out_data, out_data_n;
wire		clk_out, clk_out_n;

wire		redu_en;
wire	[1:0]	dmx_mode;
wire	[15:0]	out_data_dmx;

//调试信号
wire	[15:0]	out_tout, hub_tout;

//**************************************************************
//			   参数定义
//**************************************************************


//******************************************************************/
//			   显示缓冲区切换
//******************************************************************/
//输入帧信号延时
always @(posedge sclk or negedge resetb)
	if(resetb==0)
		vs_t<=0;
	else
		vs_t<={vs_t[3:0], vs};

//输出帧信号延时
always @(posedge sclk or negedge resetb)
	if(resetb==0)
		vsout_t<=0;
	else
		vsout_t<={vsout_t[3:0],vs_out};

//f_buf_sel信号在帧信号来时切换
always	@(posedge sclk or negedge resetb)
	if (resetb == 0)
		f_buf_sel <= 0;
	else if (input_artnet == 1)
		f_buf_sel <= 0;
	else if ((state[2] == 1'b0) && (vs_t[2:1] == 2'b01))
		f_buf_sel <= ~f_buf_sel;

//写buf选择信号同f_buf_sel
always	@(posedge sclk)
	if (input_artnet == 1)
		f_buf_sel_w <= 0;
	else
		f_buf_sel_w <= f_buf_sel;

//读buf选择信号在输出一帧开始时设置为和写buf选择信号相反
always	@(posedge sclk)
	if (input_artnet == 1)
		f_buf_sel_r <= 0;
	else if (vsout_t[4:3] == 2'b01)
		f_buf_sel_r <= ~f_buf_sel;

assign	frame_buf_sel = {f_buf_sel_r, f_buf_sel_w};

//******************************************************************/
//			   黑屏控制
//******************************************************************/
black_ctrl      black_ctrl(
		//时钟和复位
		.resetb(resetb),
		.sclk(sclk),
		
		.sync_ms(sync_us[10]),
                
		//显示设置包配置
		.state(state), 
                
		//PHY总线接口
		.set_d_ok(set_d_ok),
		.set_addr(set_addr[15:0]),
		.set_data(set_data),

		//其他输入
		.init_mode(init_mode),
		.local_dis_flag(local_dis_flag),
		.input_artnet(input_artnet),
		.input_L9(input_L9),
		.vs(vs),
                
		//标志输出
		.v_start(v_start),
		.black(black),
		
		//调试接口
		.tout()   
                );  

//**************************************************************
//		       	灯具控制
//************************************************************** 
//灯饰输出控制模块
out_ctrl_lamp out_ctrl_lamp(
		//复位和时钟
		.resetb			(resetb),
		.sclk			(sclk),
		.oclk			(oclk),
 
		.t_us			(time_us[0]),
		.t_ms			(time_us[10]),
		.t_s			(time_us[20]),

		//设置总线
		.set_d_ok		(set_d_ok),
		.set_addr		(set_addr[15:0]),
		.set_data		(set_data),

		//控制信号
		.out_en			(~init_mode),
		.v_start		(v_start),
		.black			(black),
		.state			(state),
		.state_2		(state_2),
		.cascade_light		(cascade_light),
		.device_port		(device_port),

		//显示数据读接口
		.vs_out			(vs_out),
		.mem_read_req		(mem_read_req),
		.mem_pixel_addr		(mem_pixel_addr), 
                .mem_data_sync		(mem_data_sync),
		.mem_read_data		(mem_read_data), 
		.map_adj_en		(map_adj_en),
		
		//串行输出信号
		.out_sync		(out_sync),
		.out_data		(out_data),
		.out_data_n		(out_data_n),
		.clk_out		(clk_out),
		.clk_out_n		(clk_out_n),

		//DMX输出信号
		.redu_en		(redu_en),
		.dmx_mode		(dmx_mode),
		.dmx_send_flag		(dmx_send_flag),
		.out_data_dmx		(out_data_dmx),
		
		//调试信号
		.tout			(out_tout)
		);

//背板接口
hub_port_map port_map(
		.resetb			(resetb),
		.sclk			(sclk),

		.time_2us		(time_us[1]),
		.sync_1ms		(sync_us[10]),
		
		//PHY反馈接口
		.set_addr		(set_addr),
		.rd_data		(rd_data),

		//MCU设置接口
		.cmd_d_ok		(cmd_d_ok),
		.cmd_addr		(cmd_addr),
		.cmd_data		(cmd_data),
		.cmd_rd_d		(cmd_rd_d),

		//工作模式
		.testmode		(testmode),

		//MCU辅助通讯
		.mcu_dmx_ten		(mcu_dmx_ten),
		.mcu_dmx_tx		(mcu_dmx_tx),
		.mcu_dmx_rx		(mcu_dmx_rx),

		//串行输出信号
		.out_data		(out_data),
		.out_data_n		(out_data_n),
		.clk_out		(clk_out),
		.clk_out_n		(clk_out_n),

		//DMX输出信号
		.redu_en		(redu_en),
		.dmx_mode		(dmx_mode),
		.dmx_send_flag		(dmx_send_flag),
		.out_data_dmx		(out_data_dmx),

		//端口输入输出
		.port_da		(port_da),
		.port_le		(port_le),
`ifdef H611
		.port_ex		(port_ex),
		.port_in		(port_in),
`else
		.port_ex		(port_ex),
`endif

		//调试信号
		.tout			(hub_tout)
		);

//************************************************************/
//		调试接口
//************************************************************/
assign	tout = {hub_tout, clk_out};

endmodule


